home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / games / oyatsu / src / main.c next >
Text File  |  1999-11-22  |  7KB  |  280 lines

  1. /*****************************************
  2.  
  3.     推理パズル「おやつタイム」
  4.  
  5.             メイン
  6.  
  7.  *****************************************/
  8.  
  9. #include    <stdio.h>
  10. #include    <stdlib.h>
  11. #include    <sys\iocs.h>
  12. #include    <sys\dos.h>
  13.  
  14. #include    "oyatsu.h"
  15. #include    "screen.h"
  16. #include    "pad.h"
  17. #include    "sound.h"
  18. #include    "message.h"
  19.  
  20.  
  21. /*** 条件 *******/
  22. typedef struct {
  23.     int    flag;            /* 比較条件 */
  24.     int    elm_kind;        /* 比較種類 */
  25.     int    num[3];            /* 番号 */
  26.     int    pos;            /* 表示位置 */
  27. } CONDITION;
  28.  
  29. enum {EQUAL = 0, NOT_EQ};        /* 比較条件 */
  30.  
  31.  
  32. static int        right_ans[ELM_MAX][GIRL_MAX];    /* 解答 */
  33. static CONDITION    condition[GIRL_MAX];        /* 条件 */
  34.  
  35.  
  36. /**********************************
  37.     数字を適当に並べる
  38.     戻り値    buf : 数字の並び
  39.  **********************************/
  40. static
  41. void    shuffle(int buf[GIRL_MAX])
  42. {
  43.     int    i, j, t;
  44.  
  45.     for (i = 0; i < GIRL_MAX; i++) {        /* 順番に並べる */
  46.         buf[i] = i;
  47.     }
  48.     for (i = 0; i < GIRL_MAX; i++) {        /* 並べ替え */
  49.         j = rnd(GIRL_MAX);
  50.         t      = buf[i];
  51.         buf[i] = buf[j];
  52.         buf[j] = t;
  53.     }
  54. }
  55.  
  56. /**************
  57.     条件表示
  58.  **************/
  59. static
  60. void    print_condition(void)
  61. {
  62.     CONDITION*    p;
  63.     int        girl[GIRL_MAX], junban[GIRL_MAX];
  64.     int        i, k, n;
  65.  
  66.     shuffle(girl);                    /* 発言順 */
  67.     shuffle(junban);                /* 条件提示順 */
  68.     clear_screen();                    /* 画面クリア */
  69.     for (i = 0; i < GIRL_MAX; i++) {
  70.         p = condition + junban[i];        /* 条件 */
  71.         if ( p->flag == EQUAL ) {
  72.             switch ( p->elm_kind ) {
  73.               case 0 :            /* ~が買った */
  74.                 n = (p->num[2] < 0) ? MES1A : MES2A;
  75.                 break;
  76.               case 1 :            /* ~が食べた */
  77.                 n = (p->num[2] < 0) ? MES3A : MES4A;
  78.                 break;
  79.               default :            /* ~が買ったのを食べた */
  80.                   n = MES5A;
  81.                 break;
  82.             }
  83.         }
  84.         else {                    /* 買ってない、食べてない */
  85.             n = (p->elm_kind == 0) ? MES6A : MES7A;
  86.         }
  87.         k = (p->elm_kind == 2) ? 0 : 1;
  88.         if ( girl[i] == p->num[k] ) {        /* 本人絡み */
  89.             n++;
  90.         }
  91.         else if ( girl[i] == p->num[k + 1] ) {
  92.             n += 2;
  93.         }
  94.         p->pos = print_message(girl[i], message_data[girl[i]] + n, p->num);
  95.                             /* メッセージ表示 */
  96.     }
  97. }
  98.  
  99. /**************
  100.     解答作成
  101.  **************/
  102. static
  103. void    make_answer(void)
  104. {
  105.     int    i;
  106.  
  107.     shuffle(right_ans[ELM_BUY]);            /* 買った人 */
  108.     do {
  109.         shuffle(right_ans[ELM_EAT]);        /* 食べた人 */
  110.         for (i = 0; i < GIRL_MAX; i++) {
  111.             if ( right_ans[ELM_BUY][i] == right_ans[ELM_EAT][i] ) {
  112.                 break;
  113.             }
  114.         }
  115.     } while ( i < GIRL_MAX );
  116. }
  117.  
  118. /**************
  119.     条件作成
  120.  **************/
  121. static
  122. void    make_condition(void)
  123. {
  124.     CONDITION*    p;
  125.     int        i, n[GIRL_MAX];
  126.  
  127.     shuffle(n);                    /* 提示条件の番号 */
  128.     for (i = 0, p = condition; i < 3; i++, p++) {
  129.         p->flag     = EQUAL;
  130.         p->elm_kind = i;
  131.         p->num[0]   = (i < 2) ? n[i]                     : right_ans[ELM_BUY][n[i]];
  132.         p->num[1]   = (i < 1) ? right_ans[ELM_BUY][n[i]] : right_ans[ELM_EAT][n[i]];
  133.         p->num[2]   = -1;
  134.     }
  135.  
  136.     i = rnd(2);
  137.     p->flag     = NOT_EQ;
  138.     p->elm_kind = i;
  139.     p->num[0]   = n[2];
  140.     p->num[1]   = right_ans[(i == 0) ? ELM_BUY : ELM_EAT][n[3]];
  141.     p->num[2]   = -1;
  142.  
  143.     for (i = 0; i < GIRL_MAX; i++) {
  144.         if ( (i != right_ans[ELM_EAT][n[0]])            /* 正解 */
  145.                 && (i != right_ans[ELM_BUY][n[0]])    /* 前提条件 */
  146.                 && (i != right_ans[ELM_EAT][n[1]])    /* すでに出た条件 */
  147.                 && (i != right_ans[ELM_EAT][n[2]]) ) {    /* すでに出た条件 */
  148.             condition[0].num[2] = i;    /* 食べていない */
  149.         }
  150.         if ( (i != right_ans[ELM_BUY][n[1]])            /* 正解 */
  151.                 && (i != right_ans[ELM_EAT][n[1]])    /* 前提条件 */
  152.                 && (i != right_ans[ELM_BUY][n[0]])    /* すでに出た条件 */
  153.                 && (i != right_ans[ELM_BUY][n[2]]) ) {    /* すでに出た条件 */
  154.             condition[1].num[2] = i;    /* 買っていない */
  155.         }
  156.     }
  157. }
  158.  
  159. /************************************
  160.     条件チェック
  161.     引数      p = 条件
  162.         ans = 回答
  163.     戻り値    条件に合っているか
  164.  ************************************/
  165. static
  166. Bool    check_condition(CONDITION* p, int ans[ELM_MAX][GIRL_MAX])
  167. {
  168.     Bool    f = TRUE;
  169.     int    i;
  170.  
  171.     switch ( p->elm_kind ) {
  172.       case 0 :            /* 誰が買ったか */
  173.         f = (ans[ELM_BUY][p->num[0]] == p->num[1]);
  174.         if ( ans[ELM_EAT][p->num[0]] == p->num[2] ) {
  175.             f = FALSE;
  176.         }
  177.         break;
  178.       case 1 :            /* 誰が食べたか */
  179.         f = (ans[ELM_EAT][p->num[0]] == p->num[1]);
  180.         if ( ans[ELM_BUY][p->num[0]] == p->num[2] ) {
  181.             f = FALSE;
  182.         }
  183.         break;
  184.       default :            /* 買ったのを食べたのは */
  185.         for (i = 0; i < GIRL_MAX; i++) {
  186.             if ( ans[ELM_BUY][i] == p->num[0] ) {
  187.                 f = (ans[ELM_EAT][i] == p->num[1]);
  188.                 break;
  189.             }
  190.         }
  191.         break;
  192.     }
  193.     return    (((p->flag == EQUAL) && f) || ((p->flag == NOT_EQ) && !f));
  194. }
  195.  
  196. /************************************
  197.     ゲームメイン
  198.     戻り値     TRUE : ゲーム続行
  199.         FALSE : 終了
  200.  ************************************/
  201. static
  202. Bool    game_main(void)
  203. {
  204.     static int    answer[ELM_MAX][GIRL_MAX];
  205.     CONDITION*    p;
  206.     int        i, *p0, *p1;
  207.  
  208.     set_food();                /* 菓子設定 */
  209.     make_answer();                /* 解答作成 */
  210.     make_condition();            /* 条件作成 */
  211.     print_condition();            /* 条件表示 */
  212.     if ( input_answer(answer) < 0 ) {    /* 回答入力 */
  213.         return    FALSE;
  214.     }
  215.  
  216.     p0 = &right_ans[0][0];            /* 解答 */
  217.     p1 = &answer[0][0];            /* 回答 */
  218.     for (i = 0; i < GIRL_MAX*ELM_MAX; i++) {
  219.         if ( *p0++ != *p1++ ) {
  220.             break;
  221.         }
  222.     }
  223.     if ( i == GIRL_MAX*ELM_MAX ) {        /* 正解 */
  224.         draw_atari();
  225.     }
  226.     else {                    /* 不正解 */
  227.         for (i = 0, p = condition; i < GIRL_MAX; i++, p++) {
  228.             if ( !check_condition(p, answer) ) {    /* 条件に合わない */
  229.                 draw_mujun1(p->pos);        /* 枠描画 */
  230.             }
  231.             if ( answer[ELM_BUY][i] == answer[ELM_EAT][i] ) {
  232.                                 /* 前提に合わない */
  233.                 draw_mujun2(i);            /* 枠描画 */
  234.             }
  235.         }
  236.         draw_answer(1, right_ans);    /* 解答表示 */
  237.     }
  238.  
  239.     do {                    /* ボタン入力待ち */
  240.         v_synch();
  241.         if ( esc_key ) {
  242.             return    FALSE;
  243.         }
  244.     } while ( !(get_push() & PAD_A) );
  245.  
  246.     return    TRUE;
  247. }
  248.  
  249. /************
  250.     メイン
  251.  ************/
  252. int    main(int argc, char* argv[])
  253. {
  254.     _iocs_tgusemd(0, 2);                /* グラフィック画面使用 */
  255.     _iocs_tgusemd(1, 2);                /* テキスト画面使用 */
  256.     _dos_c_curoff();                /* カーソルOFF */
  257.     _iocs_crtmod(0x0c);                /* 画面モード設定 */
  258.     _iocs_g_clr_on();                /* グラフィック画面表示 */
  259.     if ( init_screen() ) {                /* 画面初期化 */
  260.         return    1;
  261.     }
  262.     if ( init_sound() ) {                /* 音源初期化 */
  263.         return    1;
  264.     }
  265.     srand((unsigned int)_iocs_timeget());        /* 乱数初期化 */
  266.  
  267.     play_music(MUSIC_MAIN);                /* 演奏開始 */
  268.     while ( game_main() );                /* ゲームメイン */
  269.     stop_music();                    /* 演奏停止 */
  270.  
  271.     _iocs_tgusemd(0, 3);                /* グラフィック画面使用 */
  272.     _iocs_tgusemd(1, 3);                /* テキスト画面使用 */
  273.     _dos_c_width(0);                /* 画面モード設定 */
  274.     _dos_c_curon();                    /* カーソルON */
  275.     _dos_kflushio(0xff);                /* キーバッファクリア */
  276.  
  277.     return    0;
  278. }
  279.  
  280. /************ End of File ******************************************************/